package com.demo.connectdbtest.module.generatetype;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Dao {
    //example


    public static void printCollection(Collection<? extends Person> coll) {
        Iterator<? extends Person> iterator = coll.iterator();
        Iterator<?> iterator1 = coll.iterator();
        while (iterator1.hasNext()) {
            System.out.println(iterator1.next());
        }
        while(iterator.hasNext()) {
            System.out.println(iterator.hasNext());

        }
    }

    public  static void printCollection2(Collection<? super Person> coll){
        Iterator<? super Person> iterator = coll.iterator();
        Iterator<?> iterator1 = coll.iterator();
        while (iterator1.hasNext()) {
            System.out.println(iterator1.next());
        }
        while(iterator.hasNext()) {
            System.out.println(iterator.hasNext());

        }
    }
    /*public static <?> void test(ArrayList<?> list){
        //编译错误：不能用在泛型方法声明上，返回值类型前面<> 不能使用？
    }*/
   /* public static class Type<?> {
        //编译错误：不能用在泛型类的声明上
    }
    ArrayList<?> list2 = new ArrayList<?>();
    //编译错误：不能用在创建对象上，有右边属于创建集合对象
    */

    public static <T> void fromArrayToCOllection(T[] a, Collection<T> c) {
        for (T o : a) {
            c.add(o);
        }
    }

    public static void main(String[] args) {
        Object[] objects = new Object[100];
        ArrayList<Object> objects1 = new ArrayList<>();
        fromArrayToCOllection(objects, objects1);

        String[] strings = new String[20];
        Collection<String> stringArray = new ArrayList<>();
        fromArrayToCOllection(strings, stringArray);

        Collection<Double> doubleCollection = new ArrayList<>();
        //fromArrayToCOllection(strings,doubleCollection);//报错，两个不是同一个类型
        fromArrayToCOllection(strings, stringArray);//不报错
    }

    /*不管此时定义在其中的类是不是泛型类，在泛型方法中可以定义泛型参数
     * 泛型方法的格式：
     * 【访问权限】 <泛型> 返回类型 方法名（【泛型标识 参数名称】） 抛出异常
     * */
    public <E> E get(int id, E e) {
        E result = null;
        return result;

    }
}
